/**
 * 数据网格的效果
 * options参数如下：
 *  dataSource:被影响的表格，可通过selectors
 *  checkAll:影响全局选中或取消选中效果的元素
 *  checkboxName:复选框的name，此复选框影响所在行的选中与取消选中
 *  rowStyle:
 *      hover:鼠标移到表格行时的效果
 *      normal:正常状态下的效果
 *      checked:选中状态下的效果
 */
var yaGrid=new Class({
    Implements:Options,
    options:{
        dataSource:'.grid',
        checkAll:'effectAll',
        checkboxFilter:'input[name=\'sid[]\']',
        rowStyle:{
            hover:'rowHover',
            normal:'rowNormal',
            checked:'rowChecked'
        },
        onClickCell:null
    },
    rows:new Array(),
    initialize:function(options){
        var trs=$$(this.options.dataSource+' tr');
        if(trs.length==0) return;
        this.setOptions(options);
        trs.each(function(row){
            var cb=row.getElement(this.options.checkboxFilter);
            if(cb) row.store('ele_cb',cb);
            this.rows.push(row);
            row.addEvents({
                'mouseover':function(){
                    if(row.className!=this.options.rowStyle.checked) row.className=this.options.rowStyle.hover;
                }.bind(this),
                'mouseout':function(){
                    if(row.className!=this.options.rowStyle.checked) row.className=this.options.rowStyle.normal;
                }.bind(this),
                'click':function(){
                    (this.options.onClickCell==null) ? this.toggleRowChecked(row) : null;
                }.bind(this)
            });
        },this);
        $$(this.options.dataSource+' '+this.options.checkboxFilter).each(function(ips,index){
            var row=ips.getParents('tr');
            if(ips.checked) row.className=this.options.rowStyle.checked;
            else row.removeClass(this.options.rowStyle.checked);
            ips.addEvent('click',function(){
                ips.checked=(ips.checked)?false:true;
            }.bind(this));
        },this);
        var effectAll=$(this.options.checkAll);
        if(effectAll){
            effectAll.addEvent('click',function(){
                (effectAll.checked)? this.checkAllRows():this.uncheckAllRows();
            }.bind(this));
        }
    },
    checkRow:function(row,cb){
        if(!cb) cb=row.retrieve('ele_cb');
        if(!cb) return;
        cb.checked=true;
        row.className=this.options.rowStyle.checked;
    },
    uncheckRow:function(row,cb){
        if(!cb) cb=row.retrieve('ele_cb');
        if(!cb) return;
        cb.checked=false;
        row.removeClass(this.options.rowStyle.checked);
    },
    toggleRowChecked:function(row){
        var cb=row.retrieve('ele_cb');
        if(!cb) return;
        if(cb.checked) this.uncheckRow(row,cb);
        else this.checkRow(row,cb);
    },
    checkAllRows:function(){
        this.rows.each(function(row){ this.checkRow(row); },this);
    },
    uncheckAllRows:function(){
        this.rows.each(function(row){ this.uncheckRow(row); },this);
    },
    getSelectedCount:function(){
        var c=0;
        this.rows.each(function(row){
            var cb=row.retrieve('ele_cb');
            if(!cb) return;
            if(cb.checked) c++;
        });
        return c;
    }
});

/**
 * 表单效果，为输入型的表单附加各种效果(form-table结构)
 *
 * fm:表单Element
 * options:参数
 *  ipsFocus:输入型控件获得焦点时的效果（text,password,textarea的效果）
 *  ipsNormal:输入型控件正常时的状态
 *  unHighlight:非高亮状态时的行
 *  highlight:高亮当前操作的行(tr)，传入参数是className
 *  validate:验证参数，数组，每个对应一个控件 ['控件name',[{验证规则1},{验证规则2}...]]
 *      验证规则：
 *      rule: 验证规则,若此值为ajax，则表明通过ajax认证，验证地址在msg中设置
 *      msg:验证失败时提示消息
 *      type: 验证类型 blur（失去焦点时验证）,submit（提交表单时验证，默认）
 *      trim: 是否先进行trim操作，默认是true
 *      cond: 验证条件：1 (默认，必须验证)，2（值不为空就验证）
 */
var yaForm=new Class({
    Implements:Options,
    form:null,
    options:{
        ipsFocus:'textInputFocus',
        ipsNormal:'textInput',
        unHighlight:'normalTr',
        highlight:'focusTr',
        tipclass:'vaerror',
        validate:null
    },
    initialize:function(fm,options){
        this.fm=fm;
        this.fm.store('lastFocusComponent',null);
        this.setOptions(options);
        var ips=this.fm.getElements('input[type=text],input[type=password],textarea');
        ips.each(function(ic){
            ic=$(ic);
            ic.className=this.options.ipsNormal;
            ic.setProperty("autocomplete","off");
            ic.addEvents({
                'focus':function(){
                    ic.className=this.options.ipsFocus;
                    this.highlightTr(ic);
                }.bind(this),
                'blur':function(){
                    ic.className=this.options.ipsNormal;
                }.bind(this)
            });
        },this);
        if(ips.length>0){
            ips[0].focus();
        }
        this.fm.getElements('select,input[type=checkbox],input[type=radio]').each(function(ic){
            ic=$(ic);
            ic.addEvents({
                'focus':function(){ this.highlightTr(ic); }.bind(this),
                'blur':function(){  }
            });
        },this);
        //验证,validate:一个数组，第一项是控件的name属性值，第二项是一个数组
        if(this.options.validate!=null){
            var eles=this.fm.elements;
            this.options.validate.each(function(validate){
                var ele=$(eles[validate[0]]);
                if(ele){
                    ele.store('valChanged',true);
                    ele.store('passValidated',false);
                    ele.addEvents({
                        'change':function(){
                            ele.store('valChanged',true);
                        }.bind(this)/**,
                        'blur':function(){
                            this.doValidate(ele,validate[1]);
                        }.bind(this)*/
                    });
                }
            },this);
            //给表单绑定提交前的验证---一个元素只要有一次验证没通过，即不必再验证，转向下一个验证元素
            this.fm.addEvent('submit',function(){
                passValidate=true;
                this.options.validate.each(function(validate){
                    var ele=$(eles[validate[0]]);
                    if(ele && !this.doValidate(ele,validate[1])){
                            passValidate=false;
                    }
                },this);
                if(passValidate){
                    this.fm.submit();
                }
            }.bind(this));
        }
    },
    doValidate:function(ele,validates){
        if(ele.retrieve('passValidated') ) return true;  //已经验证过了就不用再验证
        if(!ele.retrieve('valChanged')){         //没通过验证值也没有改变
            return false;
        }
        ele.store('valChanged',false);  //验证完成成。无论结果如何，都没有改变了
        var val;
        if(ele.get('tag')=='select'){
            val=ele.options[ele.selectedIndex].value;
        }else{
            val=ele.getProperty("value").trim();    //皆有除去前后空格功能
        }
        for(var i=0,len=validates.length;i<len;i++){
            if(!this.testRule(ele,val,validates[i])){
                ele.store('passValidated',false);
                return false;
            }
        }
        ele.store('passValidated',true);
        return true;
    },
    testRule:function(ele,value,vaitem){    //返回true说明验证通过，否则验证失败
        var show=true,msg=vaitem.msg,type='error';
        var when=vaitem.when||null;
        if(when=='notnull' && value==""){
            this.hideTip(ele);
            return true;
        }
        switch(vaitem.rule){
            case 'ajax':
                show=false;
                new Request.JSON({
                    url:vaitem.msg+"/val/"+value,
                    method:'get',
                    onRequest:function(){ this.showTip(ele,'','loading'); }.bind(this),
                    onComplete:function(jsonObj){
                        if(jsonObj.ret=='fail'){
                            ele.store('passValidated',false);
                            this.showTip(ele,jsonObj.msg,'error');
                        }else{
                            ele.store('passValidated',true);
                            this.showTip(ele,jsonObj.msg||'ok','hint');
                            this.fm.fireEvent('submit');    //再触发一次表单提交事件
                        }
                    }.bind(this)
                }).send();
                break;
            case 'required':
                if(value.length==0) show=false;
                break;
            case 'id':
                if(!value.test('^[1-9]\d*$')) show=false;
                break;
            default:
                if(!value.test(vaitem.rule)) show=false;
        }
        if(show)  this.hideTip(ele);
        else this.showTip(ele,msg,type);
        return show;
    },
    showTip:function(ele,msg,type){
        var div=ele.getPrevious('.'+this.options.tipclass);
        if(!div){
            div=new Element('div',{
                'class':this.options.tipclass,
                'styles':{
                    'display':'none'
                }
            });
            div.inject(ele,'before');
        }
        type=type||"error";
        if(type=="error"){
            div.set('html','<span>'+msg+'</span>');
        }else if(type=="loading"){
            div.set('html','<img src="'+top._TMPL_+'../Admin/Public/img/loading.gif" alt="正在与服务器交互..."/>');
        }else if(type=="hint"){
            div.set('html','<span style="background-color:#0058E6">'+msg+'</span>');
        }
        div.setStyle('display','block');
    },
    hideTip:function(ele){
        var div=ele.getPrevious('.'+this.options.tipclass);
        if(div){
            div.setStyle('display','none');
        }
    },
    highlightTr:function(ic){
        var last=this.fm.retrieve('lastFocusComponent');
        if(ic!=last){
            if(last) last.className=this.options.unHighlight;
            var tr=ic.getParents("tr")[0];
            tr.className=this.options.highlight;
            this.fm.store('lastFocusComponent',tr);
        }
    }
});

/**
 * 表单检查函数
 */

/***  页面相关部分   ****/
var gridInst=null,formInst=null;
/**
 *表单响应函数
 */
function doAction(actionType){
    if(actionType=="back" || actionType=="historyBack"){
        //window.location=Cookie.read('lastVisitPage');
        window.history.back();
    }else{
        var isIpsForm=( actionType=='save' || actionType=='update' )?true:false;
        if( !isIpsForm && gridInst.getSelectedCount()<1){    //保存一般出现在编辑页面中
            alert("请先选择记录");
            return;
        }
        iform=document.forms[0];
        iform.elements['a'].value=actionType;
        if(typeof(before_submit)!='undefined'){
            before_submit();
        }
        if(isIpsForm){
            iform.fireEvent('submit');
        }else{
            iform.submit();
        }
    }
}

$(window).addEvents({
    'domready':function(){
        //为输入型控件绑定效果
        var ipsForm=$("ipsForm");
        if(ipsForm){
            formInst=new yaForm(ipsForm,{
                validate:(typeof(_validate)=='undefined')?null:_validate
            });
        }
        //创建数据网格
        gridInst=new yaGrid();

        if(typeof(onDomready)!='undefined'){
            onDomready();
        }
    }
});

/**
 * tools
 */
/**
 * 设定select控件的当前项
 * selectObj 传入的select HTMLElement
 */
function setSelectOption(selectObj,optionValue){
    var opt=$(selectObj).getElement("option[value="+optionValue+"]");
    if(opt){
        opt.selected=true;
    }
}
